<?php
// +----------------------------------------------------------------------
// | makePHP 
// +----------------------------------------------------------------------
// | Copyright (c) 2009 http://makephp.org All rights reserved.
// +----------------------------------------------------------------------
// | Licensed BSD.(http://www.make.org/BSD-license.txt)
// +----------------------------------------------------------------------
// | Author: 叁石(sanshi) <sanshi0815@tom.com>
// | Author: 白家昌<baijc2004cn@126.com>
// +----------------------------------------------------------------------
/**
 * 文件操作类
 * @name    FileIO
 * @see  
 * @version	1.0.0 (Tue Nov 04 15:19:32 CST 2008)
 * @author	sanshi
 */
 
class FileIO
{
   /**
	* 构造函数
	* @return void 
	* @access public
	*/
	public function __construct()
	{
		$this->FileIO();
	}
	public function FileIO()
	{
	}
	/**
	* 取得文件后缀（只取得文件的最后一个后缀名）
	* @author  sanshi
	* @version 1.0.0
	* @param 		string		$fileName	文件名		
	* @return  		string		$fileType	文件后缀
	*/
	public static function getFileType($fileName)
	{
		return strtolower(end(explode('.',$fileName)));
	}
	/**
	*判断一个文件是否存在
	*@param		$fileName	判断的文件名称
	*@return	bool		如果存在返回true
	*/
	public static function isFileExists( $fileName )
	{
		clearstatcache();
		return file_exists( $fileName ) && is_file( $fileName );
	}
	/**
	*判断一个目录是否存在
	*@param		$dirName	判断的文件名称
	*@return	bool		如果存在返回true
	*/
	public static function isDirExists( $dirName )
	{
		clearstatcache();
		return file_exists( $dirName ) && is_dir( $dirName );
	}
	/**
	*删除文件
	*@param		$fileName	删除的文件名称	
	*@return	bool		删除成功返回true
	*/
	public static function delFile($fileName)
	{
		return FileIO::isFileExists($fileName) ? unlink($fileName) : true;
	}
	/**
	*删除目录
	*@param		$dirName	删除的目录名称	
	*@return	bool		删除成功返回true
	*/
	public static function delDir($dirName)
	{
		global $FILEERRORMSG;
		 if( !FileIO::isDirExists($dirName) )
		 {
		 	//目录不存在视为删除成功
			return true;
		 }
		 $handle = @opendir($dirName);
		 while(false !== ($file = @readdir($handle)))
		 {
            if($file != "." && $file != "..")
            {
                @chmod($dirName . "/" . $file, 0777); //改变文件模式
                if(FileIO::isDirExists($dirName . "/" . $file))  //判断目录是否存在
                {
                    FileIO::delDir($dirName . "/" . $file); //存在就删除目录
                }else{
                    if( !FileIO::delFile($dirName . "/" . $file)) return false; //
                }
            }
         }
        @closedir($handle);
        @rmdir($dirName);
		return true;
	}
	/**
	*读取目录
	*@param $dirPath	dir名称
	*@return array		返回数组
	*/
	public static function getDirFile($dirPath)
	{
		$fArray = array();
		$dArray = array();
		//如果是文件
		if(FileIO::isFileExists($dirPath))
		{
			$fArray[] = $dirPath;
			return array('file'=>$fArray,'dir'=>$dArray);
		}
		//如果不是目录
		if(!FileIo::isDirExists($dirPath))
		{
			return array('file'=>$fArray,'dir'=>$dArray);
		}

		$handle=opendir($dirPath);
		while($file=readdir($handle))
		{
			if($file=='.' || $file=='..') continue;
			$fileName = $dirPath.$file;
			if(FileIo::isDirExists($fileName))
			{
				$dArray[] = $file;
			}
			if(FileIO::isFileExists($fileName))
			{
				$fArray[] = $file;
			}
		}
		closedir($handle);
		return array('file'=>$fArray,'dir'=>$dArray);
		
	}
	/**
	*写入一个文件
	*@param $fileName	文件名称
	*@param $data		文件里写入的内容
	*@param $mode		文件写入模式
	* @param $isCp      是否做备份，默认为false不做
	*@return bool		成功返回true
	*/
	public static function writeFile($fileName,$data,$mode="",$isCp=false)
	{
		$fileName = str_replace("\\","/",$fileName);
		$dirName = dirname( $fileName );//获得部分文件目录
		//$data=strval($data);
		if( !is_dir($dirName) ) //如果不是目录
		{
			if( !FileIo::createDir($dirName) ) //如果不能建立目录
			{
				return false; 
			}
		}
		//建立bak文件
		if( FileIO::isFileExists($fileName) && $isCp ) //判断文件是否存在
				FileIO::copyFile($fileName,$fileName."_".date("Y,m,d,H,i,s")); //复制文件，成功返回true
		if( function_exists("file_put_contents") && empty($mode) ) //如果方法存在与$mode是空
		{
			$inputLen = file_put_contents($fileName,strval($data)); //将$date以字符串写入$fileName文件里面
			if( $inputLen != strlen($data) ) //如果$inputLen 没有长度
			{
				return false; 
			}
		}else{
			$mode .= empty($mode) ? "w+":"b";  //是空就写入，否则就是二进制b
			//echo $mode; exit();
			$fp = fopen($fileName,$mode);
			if( !$fp )
			{
				return false;
			}
			fwrite($fp,$data,strlen($data));  //写入数据
			@fclose($fp); //关闭数据 
		}
		return true;
	}
	/**
	* 建立目录
	*@parma		$dirName	目录名称
	*@return	bool		成功返回true
	*/
	public static function createDir($dirName)
	{
		//echo $dirName;exit();
		$dirName = str_replace("\\","/",$dirName);
		$dirArr = explode('/',$dirName);
		//增加对绝对目录的判断
		$dirTemp = substr($dirName,0,1)=='/' ? "/" : "";
		foreach( (array)$dirArr as $dir )
		{
			if( empty($dir) ) continue;
			$dirTemp.= $dir."/";
			if( !is_dir($dirTemp) )
			{
				if( !@mkdir($dirTemp,0777) )
				{
					return false;
				}
				chmod($dirTemp,0777);
			}
		}
		return true;
	}
	/**
	*取得文件的内容
	*@parma		$fileName	要取得的文件名称
	*@return	如果失败返回 false 成功返回文件内容
	*/
	public static function getFileContent( $fileName )
	{
		if( !FileIO::isFileExists($fileName) ) return false;
		return function_exists("file_get_contents") ? 
			file_get_contents( $fileName ) : fread( fopen($fileName,"r"),filesize($fileName)+1 );
	}
	/**
	*文件复制
	*@param		$source		源文件
	*@param		$dest		目标文件
	*return		bool		复制成功返回true
	*/
	public static function copyFile($source, $dest)
	{
		if( !FileIO::isFileExists($source) ) return false;
		//取得copy目标目录
		$destDir = dirname($dest);
		if( !FileIO::isDirExists($destDir))
		{
			//copy目标目录不存在建立 建立不成功返回false
			if( !FileIO::createDir($destDir) ) return false;
		}
		return copy($source, $dest);
	}
	/**
	*目录复制
	*@param		$source		源文件
	*@param		$dest		目标文件
	*return		bool		复制成功返回true
	*/
	public static function copyDir($source, $dest)
	{
		if( !FileIO::isDirExists($source) ) return false;
		if( !FileIO::isDirExists($dest) ) FileIO::createDir( $dest );
		$handle = @opendir($source);
		 while(false !== ($file = @readdir($handle)))
		 {
            if($file != "." && $file != "..")
            {
				@chmod($source . "/" . $file, 0777);
				if( FileIO::isDirExists($source . "/" . $file) )
				{ 
					FileIO::copyDir( $source."/".$file."/",$dest."/".$file."/" );
				}else{
					if( !FileIO::copyFile( $source."/".$file,$dest."/".$file ) )
					{
						@closedir($handle);
						return false;
					}
				}
			}
         }
        @closedir($handle);
		return true;
	}
	/**
	*文件移动
	*@param		$source		源文件
	*@param		$dest		目标文件
	*return		bool		复制成功返回true
	*/
	public static function moveFile($source,$dest)
	{
		return FileIO::copyFile($source,$dest) && FileIo::delFile($source);
	}
	/**
	*目录移动
	*@param		$source		源文件
	*@param		$dest		目标文件
	*return		bool		复制成功返回true
	*/
	public static function moveDir($source,$dest)
	{
		return FileIO::copyDir($source,$dest) && FileIo::delDir($source);
	}
	//根据数组建立缓存数组文件
	/**
	 * @param  $str 为hash的字段
	 * @return fileName 为hash后的文件名，加目录名
	 * */
	function getHashFileName($str,$isFileName=false)
	{
		$fileName = "";
		$hashTemp = md5(strval($str));
		$fileName .=substr($hashTemp,0,2)."/";//一级目录为256个
		//$fileName .=substr($hashTemp,2,2)."/";//二级目录下单个目录为 256个
		//$fileName .=substr($hashTemp,4,3);//三级目录下单个目录为 4096个
		if($isFileName)
		{
			$fileName .=$hashTemp;
		}
		//$fileName .=substr($hashTemp,7);
		return $fileName;
	}
	/**
	 * @param  $fileName  文件名
	 * @param  $overTime  过期时间
	 * @return 返回true
	 * */
	public static function isOverTime($fileName,$overTime)
	{
		if(FileIO::isFileExists($fileName))
		{
			return time()-fileatime($fileName)>$overTime ? true : false;
		}
		return true;
	}
}
?>